package cn.dduan.fool.design.pattern.structure.decor;

/**
 * 装饰器模式
 * <p>
 * 优点：
 * 1、装饰器模式可以动态给对象添加一些额外的职责从而实现功能的拓展，在运行时选择不同的装饰器，从而实现不同的行为
 * 2、比使用继承更加灵活，通过对不同的装饰类进行排列组合，创造出很多不同行为，得到功能更为强大的对象
 * 3、符合“开闭原则”，被装饰类与装饰类独立变化，用户可以根据需要增加新的装饰类和被装饰类，在使用时再对其进行组合，原有代码无须改变
 * <p>
 * 缺点：
 * 1、首先会产生很多的小对象，增加了系统的复杂性
 * 2、第二是排错比较困难，对于多次装饰的对象，调试时寻找错误可能需要逐级排查，较为烦琐
 * <p>
 * 注意：
 * 1、装饰者与被装饰者都拥有共同的超类，但这里继承的目的是继承类型，而不是行为
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
public class DecorPattern {
    public static void main(String[] args) {
        Human human = new Person();
        Decorator decorator = new DecoratorFirst(new DecoratorZero(human));
        decorator.wearClothes();
    }
}

/**
 * 定义被装饰者
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
interface Human {
    /**
     * 穿衣服接口
     */
    void wearClothes();
}

/**
 * 定义装饰着
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
abstract class Decorator implements Human {
    private Human human;

    public Decorator(Human human) {
        this.human = human;
    }

    @Override
    public void wearClothes() {
        human.wearClothes();
    }
}

/**
 * 定义装饰一
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
class DecoratorZero extends Decorator {

    public DecoratorZero(Human human) {
        super(human);
    }

    public void goHome() {
        System.out.println("进房子。。");
    }

    @Override
    public void wearClothes() {
        super.wearClothes();
        goHome();
    }
}

/**
 * 定义装饰二
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
class DecoratorFirst extends Decorator {

    public DecoratorFirst(Human human) {
        super(human);
    }

    public void goClothespress() {
        System.out.println("去衣柜找找看。。");
    }

    @Override
    public void wearClothes() {
        super.wearClothes();
        goClothespress();
    }
}

/**
 * 实现装饰者接口
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
class Person implements Human {

    @Override
    public void wearClothes() {
        System.out.println("穿什么呢。。");
    }
}



